/*****************************************************************
Wowengine - v0.1

File: wen_game.cpp
Creation date: 2009-05-08
*****************************************************************/

/****************************************************************/
#include "wen_game.h"
#include "os/wen_window.h"
#include "graphics/wen_render.h"
#include "timer/wen_timer.h"
#include "input/wen_directInput.h"
//----------------------------------------------------------------
using namespace wen;
/****************************************************************/

/****************************/
// Constructor
/****************************/
Game::Game(HINSTANCE hInstance)
:
m_pkWindow(NULL),
m_hInstance(hInstance),
m_pkTimer(NULL),
m_pkInput(NULL),
m_pkRender(NULL)
{
}
/****************************/
// Destructor
/****************************/
Game::~Game()
{
}
/****************************/
// Inicializa el engine
/****************************/
bool Game::Init()
{
	if (!m_hInstance)
	{
		return false;
	}

	// Crea la ventana
	m_pkWindow = new Window(0);

	if (!m_pkWindow->CreateWnd(800, 600))
	{
		return false;
	}

	// Crea el render
	m_pkRender = new Render(m_pkWindow->m_hWnd);
	
	if (!m_pkRender->Init())
	{
		return false;
	}

	// Crea el timer
	m_pkTimer = new Timer();

	// Crea el input
	m_pkInput = new DirectInput(m_hInstance, m_pkWindow->m_hWnd);

	if (!m_pkInput->Init())
	{
		return false;
	}

	// Llama al OnInit del juego
	if (!OnInit())
	{
		return false;
	}

	// Inicializa el timer
	m_pkTimer->FirstMeasure();

	return true;
}
/****************************/
// Actualiza y dibuja
/****************************/
bool Game::Loop()
{
	if (!m_pkRender)
	{
		throw std::exception("El renderer es nulo");
	}

	if (!m_pkTimer)
	{
		throw std::exception("El timer es nulo");
	}

	// Actualiza el timer
	m_pkTimer->Measure();

	m_pkInput->Update();

	// Actualiza las entidades
	for (unsigned int i = 0; i < m_apkEntities.size(); ++i)
	{
		m_apkEntities[i]->Update(m_pkTimer->GetTimeBetweenFrames());
	}
	
	// Renderiza el frame
	m_pkRender->BeginFrame();

	// Llama al OnUpdate del juego
	bool bQuit = OnUpdate();

	OnDraw(*m_pkRender);

	// Termina el frame
	m_pkRender->EndFrame();

	return bQuit;
}
/****************************/
// Apaga el motor
/****************************/
bool Game::Deinit()
{
	// Llama al DeInit del juego
	if (!OnDeinit())
	{
		return false;
	}

	// Borra el render
	delete m_pkRender;
	m_pkRender = NULL;

	// Borra la ventana
	delete m_pkWindow;
	m_pkWindow = NULL;

	// Borra el timer
	delete m_pkTimer;
	m_pkTimer = NULL;

	// Borra el input
	delete m_pkInput;
	m_pkInput = NULL;

	return true;
}
//----------------------------------------------------------------